Repository navigation
Sentinel soft-fail follow-ups: discovery failure as RedisConnectionException, late sentinel init, clear LastException - #3280
Merged
Conversation
…ception, late sentinel init, clear LastException Follow-ups to #3187 (AbortOnConnectFail=false for sentinel), prompted by the investigation of #3271: - GetSentinelMasterConnection with a config that has no endpoints of its own and nothing discovered threw AggregateException(InvalidOperationException "No nodes to consider") from the seed connect. It now throws the discovery RedisConnectionException, as it did before #3187. - A sentinel connection whose initial connect soft-failed never ran InitializeSentinel, because only the connect paths called it; such a connection never subscribed to +switch-master and tracked failovers only through the fallback polling. InitializeSentinel is now idempotent and is also reached from a non-first reconfigure that detects a sentinel. - The discovery failure recorded as LastException at connect time stayed there after recovery and was folded into every later "no connection available" message. It is cleared once the managed connection is restored. - Document what abortConnect means for sentinel connections.
FloatingMilkshake
pushed a commit
to FloatingMilkshake/MechanicalMilkshake
that referenced
this pull request
Oct 24, 2026
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [StackExchange.Redis](https://seredis.dev/) ([source](https://github.com/StackExchange/StackExchange.Redis)) | nuget | patch | `3.4.0` → `3.4.20` | --- ### Release Notes <details> <summary>StackExchange/StackExchange.Redis (StackExchange.Redis)</summary> ### [`v3.4.20`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/3.4.20) [Compare Source](StackExchange/StackExchange.Redis@3.4.5...3.4.20) #### Stability improvements - Do not abandon a connection attempt before ConnectTimeout has elapsed by [@​mgravell](https://github.com/mgravell) in [#​3277](StackExchange/StackExchange.Redis#3277) - Read HELLO "server" before trusting "version" as the Redis API version by [@​mgravell](https://github.com/mgravell) in [#​3279](StackExchange/StackExchange.Redis#3279) - Sentinel soft-fail follow-ups: discovery failure as RedisConnectionException, late sentinel init, clear LastException by [@​mgravell](https://github.com/mgravell) in [#​3280](StackExchange/StackExchange.Redis#3280) - Sentinel: re-resolve the primary when it is demoted on a healthy connection by [@​rebaseandpanic](https://github.com/rebaseandpanic) in [#​3281](StackExchange/StackExchange.Redis#3281) - Route as a cluster only with a slot map; take HELLO mode/role from the interactive connection only by [@​mgravell](https://github.com/mgravell) in [#​3285](StackExchange/StackExchange.Redis#3285) - Fail connection-dropped commands with RedisConnectionException, never a raw transport exception or a cancellation by [@​mgravell](https://github.com/mgravell) in [#​3287](StackExchange/StackExchange.Redis#3287) - Connection groups: a member answering LOADING triggers an immediate re-probe and re-select by [@​mgravell](https://github.com/mgravell) in [#​3289](StackExchange/StackExchange.Redis#3289) - IBatch: complete commands refused by a poisoned connection; divert a batch's tail on reconnect by [@​mgravell](https://github.com/mgravell) in [#​3286](StackExchange/StackExchange.Redis#3286) - Give multi-message sub-commands and injected prefix commands a write time by [@​mgravell](https://github.com/mgravell) in [#​3293](StackExchange/StackExchange.Redis#3293) - Send primary-only commands to the primary when the caller prefers a replica by [@​AsadIqbal-Dev](https://github.com/AsadIqbal-Dev) in [#​3291](StackExchange/StackExchange.Redis#3291) #### Maintenance - Tests: stabilise two recurring Windows CI flakes (hash-field expiry clock skew, backlog counter quiescence) by [@​mgravell](https://github.com/mgravell) in [#​3288](StackExchange/StackExchange.Redis#3288) - Tests: don't race the connect's own reconfigures in AllClusterCommandsRefusedIsQuiet by [@​mgravell](https://github.com/mgravell) in [#​3290](StackExchange/StackExchange.Redis#3290) - Refresh package pins: 10.0.13 servicing family and tooling by [@​mgravell](https://github.com/mgravell) in [#​3294](StackExchange/StackExchange.Redis#3294) - xunit.v3 4.0 on Microsoft.Testing.Platform by [@​mgravell](https://github.com/mgravell) in [#​3295](StackExchange/StackExchange.Redis#3295) - StyleCop.Analyzers 1.3.151-beta, and the tidy-up it asks for by [@​mgravell](https://github.com/mgravell) in [#​3296](StackExchange/StackExchange.Redis#3296) #### New Contributors - [@​AsadIqbal-Dev](https://github.com/AsadIqbal-Dev) made their first contribution in [#​3291](StackExchange/StackExchange.Redis#3291) **Full Changelog**: <StackExchange/StackExchange.Redis@3.4.5...3.4.20> </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODEuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE4MS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.milkshake.services/FloatingMilkshake/MechanicalMilkshake/pulls/10 Reviewed-by: Milkshake <me@floatingmilkshake.com>
FloatingMilkshake
pushed a commit
to FloatingMilkshake/Azusa
that referenced
this pull request
Oct 24, 2026
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [StackExchange.Redis](https://seredis.dev/) ([source](https://github.com/StackExchange/StackExchange.Redis)) | nuget | patch | `3.4.0` → `3.4.20` | --- ### Release Notes <details> <summary>StackExchange/StackExchange.Redis (StackExchange.Redis)</summary> ### [`v3.4.20`](https://github.com/StackExchange/StackExchange.Redis/releases/tag/3.4.20) [Compare Source](StackExchange/StackExchange.Redis@3.4.5...3.4.20) #### Stability improvements - Do not abandon a connection attempt before ConnectTimeout has elapsed by [@​mgravell](https://github.com/mgravell) in [#​3277](StackExchange/StackExchange.Redis#3277) - Read HELLO "server" before trusting "version" as the Redis API version by [@​mgravell](https://github.com/mgravell) in [#​3279](StackExchange/StackExchange.Redis#3279) - Sentinel soft-fail follow-ups: discovery failure as RedisConnectionException, late sentinel init, clear LastException by [@​mgravell](https://github.com/mgravell) in [#​3280](StackExchange/StackExchange.Redis#3280) - Sentinel: re-resolve the primary when it is demoted on a healthy connection by [@​rebaseandpanic](https://github.com/rebaseandpanic) in [#​3281](StackExchange/StackExchange.Redis#3281) - Route as a cluster only with a slot map; take HELLO mode/role from the interactive connection only by [@​mgravell](https://github.com/mgravell) in [#​3285](StackExchange/StackExchange.Redis#3285) - Fail connection-dropped commands with RedisConnectionException, never a raw transport exception or a cancellation by [@​mgravell](https://github.com/mgravell) in [#​3287](StackExchange/StackExchange.Redis#3287) - Connection groups: a member answering LOADING triggers an immediate re-probe and re-select by [@​mgravell](https://github.com/mgravell) in [#​3289](StackExchange/StackExchange.Redis#3289) - IBatch: complete commands refused by a poisoned connection; divert a batch's tail on reconnect by [@​mgravell](https://github.com/mgravell) in [#​3286](StackExchange/StackExchange.Redis#3286) - Give multi-message sub-commands and injected prefix commands a write time by [@​mgravell](https://github.com/mgravell) in [#​3293](StackExchange/StackExchange.Redis#3293) - Send primary-only commands to the primary when the caller prefers a replica by [@​AsadIqbal-Dev](https://github.com/AsadIqbal-Dev) in [#​3291](StackExchange/StackExchange.Redis#3291) #### Maintenance - Tests: stabilise two recurring Windows CI flakes (hash-field expiry clock skew, backlog counter quiescence) by [@​mgravell](https://github.com/mgravell) in [#​3288](StackExchange/StackExchange.Redis#3288) - Tests: don't race the connect's own reconfigures in AllClusterCommandsRefusedIsQuiet by [@​mgravell](https://github.com/mgravell) in [#​3290](StackExchange/StackExchange.Redis#3290) - Refresh package pins: 10.0.13 servicing family and tooling by [@​mgravell](https://github.com/mgravell) in [#​3294](StackExchange/StackExchange.Redis#3294) - xunit.v3 4.0 on Microsoft.Testing.Platform by [@​mgravell](https://github.com/mgravell) in [#​3295](StackExchange/StackExchange.Redis#3295) - StyleCop.Analyzers 1.3.151-beta, and the tidy-up it asks for by [@​mgravell](https://github.com/mgravell) in [#​3296](StackExchange/StackExchange.Redis#3296) #### New Contributors - [@​AsadIqbal-Dev](https://github.com/AsadIqbal-Dev) made their first contribution in [#​3291](StackExchange/StackExchange.Redis#3291) **Full Changelog**: <StackExchange/StackExchange.Redis@3.4.5...3.4.20> </details> --- ### Configuration 📅 **Schedule**: (UTC) - Branch creation - At any time (no schedule defined) - Automerge - At any time (no schedule defined) 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 🔕 **Ignore**: Close this PR and you won't be reminded about this update again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate CLI](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0NC4xODEuMCIsInVwZGF0ZWRJblZlciI6IjQ0LjE4MS4wIiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6W119--> Reviewed-on: https://git.milkshake.services/FloatingMilkshake/Azusa/pulls/10 Reviewed-by: Milkshake <me@floatingmilkshake.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Follow-ups to #3187 (
AbortOnConnectFail=falsefor sentinel), as promised in #3271. None of this changes behaviour forabortConnect=true.Changes
RedisConnectionException.GetSentinelMasterConnectionwith a config that has no endpoints of its own (the direct-API pattern: a long-livedSentinelConnect, then a per-service config carrying onlyServiceName) threwAggregateException(InvalidOperationException("No nodes to consider"))from the seed connect when nothing was discovered. It now throws the discoveryRedisConnectionException, as it did before Fix Sentinel connection leak and AbortOnConnectFail=false handling #3187. Measured against a live sentinel with an unknown service name.InitializeSentinel, because only the connect paths call it. Such a connection recovered and followed failovers, but only via the fallback polling: it never subscribed to+switch-master. Measured: subscription absent after recovery.InitializeSentinelis now idempotent and is also reached from a non-first reconfigure that detects a sentinel. The first connect still leaves it toConnectImpl, so the happy-path ordering is unchanged.LastExceptioncleared on recovery. The discovery failure recorded at connect time stayed inLastExceptionafter the connection reached its primary, and the exception factory folded it into every later "no connection available" message. Cleared inOnManagedConnectionRestoredonce the switch succeeds.Configuration.mdnow says whatabortConnectmeans for sentinel connections, and thatabortConnect=trueis the fail-fast setting.Tests
SentinelConfigTests.GetSentinelMasterConnection_NothingToSeedWith_AbortDisabled_ThrowsTheDiscoveryFailure(closed loopback port, no topology).SentinelTests.AbortOnConnectFailFalseRecoversOnceSentinelsAppearadditionally asserts the+switch-mastersubscription and a nullLastExceptionafter recovery; both were false before this change.Sentinel*classes pass against a local primary/replica/three-sentinel topology (32 passed, 1 long-running skip).dotnet build Build.csproj -c Release /p:CI=trueis clean. No public API changes.